PHP MVC Dispatching
Routing leert ons de weg waar we naar toe willen. Dispatching slaat de opgegeven weg in.
Stappenplan
- Voorkennis: PHP Routing
De methode
getRouteData
breekt de uri op in de naam van de controllerklasse, de actiemethode en een eventuele parameter. Vertalingen voor routing zijn: routeren ; routetoewijzing ; routering ; routing ; route-bepaling ; route ; reisweg ; vervoerweg ; routebepaling ; routekeuze. En dat is precies wat we in PHP routing hebben gedaan. Meer dus dan een URI splitsen. Deze methode retourneert een associatieve array:return array( 'controllerClassName' => $controllerClassName, 'actionMethodName' => $actionMethodName, 'parameterValue' => $parameterValue);
- De eenvoudigste manier om te dispatchen is met een
switch
. In de index.php van de root schrijf je:<?php
// var_dump($_SERVER); use ThreepennyMVC\FrontController; include_once('../vendor/threepennymvc/FrontController.php'); include_once('./Controllers/AdminController.php'); // default namespace is root \ // otherwise specify it as argument $route = FrontController::getRouteData($_SERVER['REQUEST_URI'], 'Fricfrac', 'Admin', 'index'); // var_dump($route); switch ($route["controllerClassName"]) { case 'Fricfrac\Controllers\AdminController' : switch ($route["actionMethodName"]) { case 'index' : $controller = new \Fricfrac\Controllers\AdminController(); $view = $controller->index(); break; } }
- Dat is geen probleem zolang er niet teveel cases in de
switch
staan. Maar voor een applicatie als Fric-frac wordt dat al gauw een lange rij. We kunnen dit vereenvoudigen door een dispatchter te schrijven die met behulp van relfection de actiemethode van de controller-klasse uitvoert.- Voor de gevorderden:
Philip Brown, What is Reflection in PHP?, 2 Jul 2014
PHP manual: The ReflectionClass class - De
dispatch
methode heeft$action
parameter waarin de routing, die doorgetRouting
werd geretourneerd, wordt doorgegeven. DeReflectionClass
van PHP gebruikt die routingdata om een instantie van de opgeven Controllerklasse te maken en de opgegeven methode uit te voeren:public static function dispatch($action) { try { $reflection = new \ReflectionClass($action['controllerClassName']); try { $actionMethod = new \ReflectionMethod($action['controllerClassName'], $action['actionMethodName']); $controller = $reflection->newInstance(); return $actionMethod->invokeArgs($controller, array($action['parameterValue'])); } catch (\ReflectionException $e) { $actionMethodName = $action['actionMethodName']; echo "Method $actionMethodName does not exist!"; return false; } } catch (\ReflectionException $e) { $controllerClassName = $action['controllerClassName']; echo "Class $controllerClassName does not exist!"; return false; } }
- Plaats de
dispatch
methode in deFrontController
klasse.
- Voor de gevorderden:
2020-04-09 07:29:34